home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 276-300 / 294 / dnet / amiga / client / putfiles.c < prev    next >
C/C++ Source or Header  |  1995-03-14  |  4KB  |  200 lines

  1.  
  2. /*
  3.  *  PUTFILES.C
  4.  *
  5.  *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  6.  *
  7.  *  Upload one or more files or directories to the remote host
  8.  */
  9.  
  10. #include "defs.h"
  11.  
  12. char Buf[1024];
  13.  
  14. int putname ARGS((void *, char *));
  15. int putfile ARGS((void *, char *, char *));
  16. int writehdr ARGS((void *, ubyte, char *, long));
  17.  
  18. void main ARGS((int, char **));
  19.  
  20. int
  21. brk()
  22. {
  23.     return(0);
  24. }
  25.  
  26. void
  27. main(ac,av)
  28. char *av[];
  29. {
  30.     void *chan;
  31.     short i;
  32.     char fn = 0;
  33.     char *host = NULL;
  34.     char *dir = NULL;
  35.  
  36.     printf("PutFiles V%s%s\n", VERSION, PUTFILES_VERSION);
  37.     ac = DoOption(ac, av, "N%sd%s", &host, &dir);
  38.  
  39.     onbreak(brk);
  40.     if (ac <= 1) {
  41.     puts("putfiles [-Nnetid] [-dremotedir] file/dir file/dir ....");
  42.     exit(1);
  43.     }
  44.     chan = DOpen(host, PORT_FILECOPY, -80, 126);
  45.     if (!chan) {
  46.     puts("Unable to connect");
  47.     exit(1);
  48.     }
  49.     DRead(chan, &fn, 1);
  50.     if (fn == 'S') {
  51.     puts("Remote Server Permission Denied");
  52.     DClose(chan);
  53.     exit(1);
  54.     }
  55.     if (fn != 'Y') {
  56.     puts("Remote Server Software Error");
  57.     DClose(chan);
  58.     exit(1);
  59.     }
  60.     if (dir) {
  61.     if (writehdr(chan, 'C', dir, 0) != 'Y') {
  62.         printf("Remote directory unavailable: %s\n", dir);
  63.         goto fail;
  64.     }
  65.     }
  66.     for (i = 1; i < ac; ++i) {
  67.     if (putname(chan, av[i]) < 0)
  68.         break;
  69.     }
  70. fail:
  71.     printf("\nclosing... ");
  72.     fflush(stdout);
  73.     DClose(chan);
  74.     puts("done");
  75. }
  76.  
  77. int
  78. putname(chan, file)
  79. void *chan;
  80. char *file;
  81. {
  82.     long lock = Lock(file, SHARED_LOCK);
  83.     long dirl;
  84.     int ret = 1;
  85.     FIB *fib = (FIB *)malloc(sizeof(FIB));
  86.  
  87.     printf("%-20s ", file);
  88.     if (lock == NULL || !Examine(lock, fib)) {
  89.     if (lock)
  90.         UnLock(lock);
  91.     free(fib);
  92.     puts("NOT FOUND");
  93.     return(1);
  94.     }
  95.     if (fib->fib_DirEntryType > 0) {
  96.     char *dirname = (fib->fib_FileName[0]) ? fib->fib_FileName : "ram";
  97.     puts("DIR");
  98.     dirl = (long)CurrentDir(lock);
  99.     if (writehdr(chan, 'X', dirname, 0) != 'Y') {
  100.         puts("Remote unable to make directory");
  101.         goto f1;
  102.     }
  103.     while (ExNext(lock, fib)) {
  104.         if (putname(chan, fib->fib_FileName) < 0) {
  105.         ret = -1;
  106.         goto f1;
  107.         }
  108.     }
  109.     writehdr(chan, 'Y', "?", 0);
  110. f1:
  111.     UnLock(CurrentDir(dirl));
  112.     } else {
  113.     UnLock(lock);
  114.     ret = putfile(chan, file, fib->fib_FileName);
  115.     }
  116.     free(fib);
  117.     return(ret);
  118. }
  119.  
  120. int
  121. putfile(chan, file, stripedname)
  122. void *chan;
  123. char *file;
  124. char *stripedname;
  125. {
  126.     long fh = (long)Open(file, 1005);
  127.     long n, r, len;
  128.     long ttl = 0;
  129.     char co;
  130.  
  131.     fflush(stdout);
  132.     if (fh == NULL) {
  133.     puts("FILE NOT FOUND");
  134.     return(0);
  135.     }
  136.     Seek(fh, 0, 1);                 /*  get length */
  137.     len = ttl = Seek(fh, 0, -1);
  138.     if (writehdr(chan, 'W', stripedname, len) != 'Y') {
  139.     puts("REMOTE UNABLE TO ACCEPT FILE");
  140.     Close(fh);
  141.     return(0);
  142.     }
  143.     printf("%6ld/%-6ld", ttl - len, ttl);
  144.     while (len) {
  145.     fflush(stdout);
  146.     r = (len > sizeof(Buf)) ? sizeof(Buf) : len;
  147.     n = Read(fh, Buf, r);
  148.     if (n != r) {
  149.         puts("Local File error");
  150.         Close(fh);
  151.         return(-1);
  152.     }
  153.     if (DWrite(chan, Buf, n) != n) {
  154.         puts("Remote error");
  155.         Close(fh);
  156.         return(-1);
  157.     }
  158.     if (SetSignal(0,0) & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D)) {
  159.         puts("\nBreak");
  160.         Close(fh);
  161.         return(-1);
  162.     }
  163.     len -= n;
  164.     printf("\010\010\010\010\010\010\010\010\010\010\010\010\010");
  165.     printf("%6ld/%-6ld", ttl - len, ttl);
  166.     }
  167.     Close(fh);
  168.     printf("Queued, waiting...");
  169.     fflush(stdout);
  170.     DRead(chan, &co, 1);
  171.     if (co != 'Y') {
  172.     puts("Remote Server Software Error");
  173.     return(-1);
  174.     }
  175.     puts("  OK");
  176.     return(0);
  177. }
  178.  
  179. int
  180. writehdr(chan, c, name, len)
  181. void *chan;
  182. unsigned char c;
  183. char *name;
  184. long len;
  185. {
  186.     if (DWrite(chan, &c, 1) != 1)
  187.     return(-1);
  188.     c = strlen(name) + 1;
  189.     if (DWrite(chan, &c, 1) != 1)
  190.     return(-1);
  191.     if (DWrite(chan, name, c) != c)
  192.     return(-1);
  193.     if (DWrite(chan, &len, 4) != 4)
  194.     return(-1);
  195.     if (DRead(chan, &c, 1) == 1)
  196.     return((int)c);
  197.     return(-1);
  198. }
  199.  
  200.